From c311699be94ec51ce78dd532831a117e053aacf8 Mon Sep 17 00:00:00 2001 From: "emellor@leeni.uk.xensource.com" Date: Tue, 8 Nov 2005 03:07:57 +0100 Subject: [PATCH] Rearrange restart logic so that a failure to restart a domain does not cause cascading secondary errors. Fixes bug #384. Signed-off-by: Ewan Mellor --- tools/python/xen/xend/XendDomainInfo.py | 40 ++++++++++++++----------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 6735ccc0f2..e03e5a63c5 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -90,6 +90,8 @@ ZOMBIE_PREFIX = 'Zombie-' """Minimum time between domain restarts in seconds.""" MINIMUM_RESTART_TIME = 20 +RESTART_IN_PROGRESS = 'xend/restart_in_progress' + xc = xen.lowlevel.xc.new() xroot = XendRoot.instance() @@ -1269,14 +1271,14 @@ class XendDomainInfo: config = self.sxpr() - if self.readVm('xend/restart_in_progress'): + if self.readVm(RESTART_IN_PROGRESS): log.error('Xend failed during restart of domain %d. ' 'Refusing to restart to avoid loops.', self.domid) self.destroy() return - self.writeVm('xend/restart_in_progress', 'True') + self.writeVm(RESTART_IN_PROGRESS, 'True') now = time.time() rst = self.readVm('xend/previous_restart_time') @@ -1298,26 +1300,28 @@ class XendDomainInfo: self.preserveForRestart() else: self.destroyDomain() - + + # new_dom's VM will be the same as this domain's VM, except where + # the rename flag has instructed us to call preserveForRestart. + # In that case, it is important that we remove the + # RESTART_IN_PROGRESS node from the new domain, not the old one, + # once the new one is available. + + new_dom = None try: xd = get_component('xen.xend.XendDomain') new_dom = xd.domain_create(config) - try: - new_dom.unpause() - except: - new_dom.destroy() - raise + new_dom.unpause() + new_dom.removeVm(RESTART_IN_PROGRESS) except: - log.exception('Failed to restart domain %d.', self.domid) - finally: - # new_dom's VM will be the same as this domain's VM, except where - # the rename flag has instructed us to call preserveForRestart. - # In that case, it is important that we use new_dom.removeVm, not - # self.removeVm. - new_dom.removeVm('xend/restart_in_progress') - - # self.configure_bootloader() - # self.exportToDB() + if new_dom: + new_dom.removeVm(RESTART_IN_PROGRESS) + new_dom.destroy() + else: + self.removeVm(RESTART_IN_PROGRESS) + raise + except: + log.exception('Failed to restart domain %d.', self.domid) def preserveForRestart(self): -- 2.30.2